home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / COM / Saneatsu 1.5 PPC.sit / Saneatsu 1.5 PPC / 實篤・スクリプティングの手引き < prev    next >
Text File  |  1996-11-18  |  14KB  |  447 lines

  1. ■ Saneatsu Lite スクリプティングの手引き
  2.  
  3. Copyright (C) 1996 Takeshi Yoneki / OSTRACISM CO.
  4. OSTRA / Takeshi Yoneki / 米木 武
  5. Nifty-Serve : GCC01675
  6.  
  7. Sanesatu Lite 1.5 1996.10.21
  8.  
  9.  
  10. ■ はじめに
  11.  
  12.  實篤のスクリプト化はまだ完成していません。もっと良い実装方法があるとも思いますが、ともかく現状の説明をします。今後改造が入るとスクリプトの互換性が失われる可能性がありますので、その点はご了承下さい。スクリプト化のご意見、ご感想、ご指導をお待ちしています。また、完全にテストしきれていませんのでバグ報告もお願いします。
  13.  
  14.  スクリプト化を実装したことで、實篤は初期のバージョン(1.0、1.1)に比べいくらかメモリを多く消費するようになりました。これは多くのローレベルのオブジェクトで仮想関数を持ってしまったことが原因です。特に影響を与えているのは文字列オブジェクトとリストオブジェクトでしょう。實篤のスクリプト化実装では文字列などのオブジェクトに対しkAEGetDataといったようなイベントを直接渡しています。
  15.  
  16.  スクリプト可能なアプリケーションのAppleScriptスクリプティング機能を使うときに、普通'aete'リソースを元にした「用語説明」を参照しますが、これだけでスクリプトが書けるかというとそれは全くの『嘘』です。クラスとメソッドの一覧を得ることはできますが、どのクラスがどのメソッドを持つかの情報は結局'aete'リソースには入っていないからです。
  17.  そこで、實篤のクラスとメソッドを解説します。結果的に實篤のオブジェクトモデル(階層)を説明することになるでしょう。
  18.  
  19.  
  20. ■ クラス構造
  21.  
  22.  實篤のログは下記のクラス構造でアクセスします
  23. application -*- bbs -*- forum -*- room -*- message
  24.  
  25. 例:
  26. (*    "room"クラスを指定するためにbbsから順番に名前で指示しています。
  27.     "room"には"message count"というプロパティがあり、それを"get"しています。
  28. *)
  29. tell application "Saneatsu Lite"
  30.     tell room "MAIL" of forum "MAIL" of bbs "NIFTY-J"
  31.         get message count
  32.     end tell
  33. end tell
  34.  
  35.  クラスは通常エレメントとプロパティを含有しています。"room"にとって"message"はエレメントですが、"message count"はプロパティです。クラスの含有するエレメントは全体としてクラスの階層構造を作り、スクリプトでは"of"を使ってそれを表現することになります。親子関係と考えて良いでしょう。
  36.  ただ、プロパティもまたクラスです。更に下層構造を持つプロパティも考えられますが、多くはそのレベルが最下層となるようです。もちろん"of"で関係を表現します。
  37.  エレメントとプロパティの違いはなかなか面倒くさいものですが、ある部分をエレメントとするかプロパティとするかはスクリプト可能なアプリケーションの『設計者』が悩むことであり、スクリプトを書く側の気にすることではありません。
  38.  
  39.  AppleScriptの基本的なメソッドに"get"と"set"があります。プロパティはほぼ確実に"get"の対象になりますが、エレメントが"get"の対象になるかどうかはまちまちです。プロパティはデータとして意義のあるものが"get"できなすが、エレメントを"get"したときに得られるものは通常「オブジェクトスペシファイア」という、オブジェクトを特定するためのスクリプト内部で意味を持つ「表現」そのものです。
  40.  "room"のプロパティの"message count"は整数が"get"できますが、エレメントである"message"を"get"したときにはその"message"を示す表現が得られます。例外もあり、"line"は"window"のエレメントですが、"get"すると内容である文字列が得られます。
  41.  逆にプロパティは"get"と"set"以外のメソッドは持たないようです。エレメントは独特なメソッドを持ちます。"message"は"bookmark"できますが、"message count"を"bookmark"するというのは意味を持ちません。また、エレメントは"tell"の対象になります。
  42.  "message"は構造を規定する論理的な存在でしかなく、結局は「その発言を下さい」とは書けず、「その発言のタイトルを下さい」とか「その発言のハンドルを下さい」となるわけです。"title"や"handle"は"message"のプロパティです。
  43.  "set"は"get"の裏返しです。"get"できないものに"set"は通常できません。'aete'の記述でもread only/read writeの二つの特性があるのみで、write onlyという特性はありません。readが"get"で、writeが"set"です。
  44.  「オブジェクトスペシファイア」を返すものに"set"することは意味を持ちません。
  45.  "get"はスクリプトで"get"と書く以外でも、例えば"copy"でもアプリケーションに伝わります。
  46.  
  47. 例:
  48. (*    "room"クラスを指定するためにbbsから順番に名前で指示しています。
  49.     "message"クラスを順序数で指定しています。
  50.     "message"には"title"というプロパティがあり、それに"set"しています。
  51. *)
  52. tell application "Saneatsu Lite"
  53.     tell room "MAIL" of forum "MAIL" of bbs "NIFTY-J"
  54.         set title of message 1 to "メール1番"
  55.     end tell
  56. end tell
  57.  
  58. 例:
  59. (*    "application"クラスのプロパティである"log folder"を
  60.     file "USER:Term:Log:"にします。
  61.     ファイルを即値で指定するときは絶対パスでなくてはいけないようです。
  62.     ディレクトリを指定するときもキーワード"file"は変わりません。
  63. *)
  64. tell application "Saneatsu Lite"
  65.     set log folder to file "USER:Term:Log:"
  66. end tell
  67.  
  68.  實篤のスクリプト化でログに関してやりたいことは、特定条件での情報の収集と加工に他ならず、ともかく変に實篤の持つユーザインタフェースにとらわれてはいけないであろうと考えました。可能な限り単純なクラス構造を提供し、その全てのデータにアクセスできるようにスクリプト化しました。
  69.  ログには論理的な構造と物理的な実体があります。"room"は論理的に"forum"に含まれますが、実際には1つのファイルです。そこで、"room"には"log file"というプロパティがあり、対応するファイルの情報を得ることができます。
  70.  
  71.  ウィンドウクラスはエディタとしての機能がかなり少ないと思いますが、「加工したテキストの保存場所」という程度の意味で実装しました。また、ウィンドウクラスが一般的に持つべきプロパティもほとんどありません。一応"line"でテキストをエディットできる格好にしてあります。
  72.  
  73.  bbs、forum、room、messageは「some bbs」のように「some」を使って指定した場合に「カレント」を返すようにしました。これには異論があろうとは思いますが、カレントを指定する良い方法が思い当たらなかったためです。一応プロパティにカレントを用意しましたが、使い勝手は良くないようです。
  74.  
  75.  
  76. ■ リファレンス
  77.  
  78. "application"
  79. アプリケーションクラス
  80.     エレメント
  81.         bbs
  82.             BBS
  83.         window
  84.             ウィンドウ
  85.     プロパティ
  86.         name [r/ ] (文字列)
  87.             アプリケーションの名前
  88.         log folder [r/w] (ファイルスペック)
  89.             ログフォルダ
  90.             変更はpreferencesには残らない一時的なもの
  91.             変更したらtheLogをデストラクトして新たにコンストラクトする
  92.         post folder [r/w] (ファイルスペック)
  93.             ポストフォルダ
  94.             変更はpreferencesには残らない一時的なもの
  95.             単純変更
  96.         bookmarker folder [r/w] (ファイルスペック)
  97.             栞フォルダ
  98.             変更はpreferencesには残らない一時的なもの
  99.             単純変更
  100.         bbs count [r/ ] (整数)
  101.             BBSの数
  102.         current bbs [r/ ] (オブジェクトスペシファイア)
  103.             カレントのBBS
  104.     メソッド
  105.         make window
  106.             エディタ"window"を新規作成する
  107.  
  108. "bbs"
  109. BBSクラス
  110.     エレメント
  111.         forum
  112.             フォーラム
  113.     プロパティ
  114.         name [r/ ] (文字列)
  115.             BBS名
  116.         order number [r/ ] (整数)
  117.             順序数
  118.         log folder [r/ ] (ファイルスペック)
  119.             BBSのログフォルダ
  120.         bookmarker folder [r/ ] (ファイルスペック)
  121.             BBSの栞フォルダ
  122.         forum count [r/ ] (整数)
  123.             フォーラムの数
  124.         current forum [r/ ] (オブジェクトスペシファイア)
  125.             カレントのフォーラム
  126.     メソッド
  127.         get
  128.             "bbs"のオブジェクトスペシファイアを返す
  129.  
  130. "forum"
  131. フォーラムクラス
  132.     エレメント
  133.         room
  134.             会議室
  135.     プロパティ
  136.         name [r/ ] (文字列)
  137.             フォーラム名
  138.         order number [r/ ] (整数)
  139.             順序数
  140.         room count [r/ ] (整数)
  141.             会議室数(会議室ファイルの数)
  142.         current room [r/ ] (オブジェクトスペシファイア)
  143.             カレントの会議室
  144.     メソッド
  145.         get
  146.             "forum"のオブジェクトスペシファイアを返す
  147.  
  148. "room"
  149. 会議室クラス
  150.     エレメント
  151.         message
  152.             発言(メール)
  153.     プロパティ
  154.         name [r/ ] (文字列)
  155.             会議室の名前(ファイル名)
  156.         order number [r/ ] (整数)
  157.             順序数
  158.         title [r/w] (文字列)
  159.             会議室タイトル
  160.             リソースに反映
  161.         room number [r/ ] (整数)
  162.             会議室番号
  163.         section [r/ ] (整数)
  164.             セクション番号
  165.         message count [r/ ] (整数)
  166.             発言(メール)の数
  167.         log file [r/ ] (ファイルスペック)
  168.             ログファイル
  169.         max count [r/ ] (整数)
  170.             最大発言数
  171.         day limit [r/w] (整数)
  172.             削除するための経過日数
  173.             リソースに反映
  174.         delele_day_flag [r/w] (論理値)
  175.             既読の発言は経過時間により削除する
  176.             リソースに反映
  177.         delete_unread_flag [r/w] (論理値)
  178.             未読の発言も経過時間により削除する
  179.             リソースに反映
  180.         delete_all_read_flag [r/w] (論理値)
  181.             既読の発言は全て削除する
  182.             リソースに反映
  183.         unread count [r/ ] (整数)
  184.             未読発言(メール)の数
  185.         current message [r/ ] (オブジェクトスペシファイア)
  186.             カレントのメッセージ
  187.     メソッド
  188.         get
  189.             "room"のオブジェクトスペシファイアを返す
  190.  
  191. "message"
  192. 発言(メール)クラス
  193.     プロパティ
  194.         name [r/w] (文字列)
  195.             発言タイトル
  196.             リソースに反映
  197.         title [r/w] (文字列)
  198.             nameと同じ
  199.             発言タイトル
  200.             リソースに反映
  201.         id [r/w] (文字列)
  202.             ID
  203.             リソースに反映
  204.         handle [r/w] (文字列)
  205.             ハンドル
  206.             リソースに反映
  207.         message number [r/w] (整数)
  208.             発言番号
  209.             リソースに反映
  210.         response number [r/w] (整数)
  211.             発言リンク先の番号
  212.             リソースに反映
  213.         order number [r/ ] (整数)
  214.             リストに表示されてるソート後の順序数
  215.         index number [r/ ] (整数)
  216.             インデックス番号(1〜n)
  217.             リソース上の順序数(ファイル上の順番)
  218.         length [r/ ] (整数)
  219.             本文サイズ
  220.         file position [r/w] (整数)
  221.             会議室ファイル上の位置
  222.             リソースに反映
  223.         read_mark [r/w] (論理値)
  224.             既読マーク(trueでON)
  225.             リソースに反映
  226.         protect_mark [r/w] (論理値)
  227.             保護マーク(trueでON)
  228.             リソースに反映
  229.         delete_mark [r/w] (論理値)
  230.             削除マーク(trueでON)
  231.             リソースに反映
  232.         selected [r/w] (論理値)
  233.             発言タイトル一覧の選択状態(trueでON)
  234.         date [r/w] (文字列)
  235.             日付
  236.             "1996/7/30"という書式
  237.             リソースに反映
  238.         time [r/w] (文字列)
  239.             時刻
  240.             "01:25:00"という書式
  241.             リソースに反映
  242.         contents [r/ ] (文字列)
  243.             テキスト全体
  244.     メソッド
  245.         select
  246.             発言の選択
  247.             選択された発言以外の選択は解除される
  248.             複数選択には"selected"プロパティを使う
  249.         bookmark
  250.             栞をはさむ
  251.         get
  252.             "message"のオブジェクトスペシファイアを返す
  253.  
  254. "window"
  255. ウィンドウクラス
  256.     エレメント
  257.         line
  258.             テキストの行
  259.             何行目かで指定する
  260.     プロパティ
  261.         name [r/w] (文字列)
  262.             ウィンドウの名前
  263.             メインのビューウィンドウは"ブラウズウィンドウ"で、これだけは変更できない
  264.         line count [r/ ] (整数)
  265.             テキストの行数
  266.         modified [r/ ] (論理値)
  267.             モディファイされているかどうか(trueでモディファイされている)
  268.             "ブラウズウィンドウ"には意味がない
  269.         contents [r/w] (文字列)
  270.             テキスト全体
  271.         posted [r/w] (論理値)
  272.             保存時に"/POST"を付加するかどうか(trueで付加する)
  273.             "ブラウズウィンドウ"には意味がない
  274.     メソッド
  275.         add
  276.             [data]
  277.             [file]
  278.             テキストの付加
  279.         insert
  280.             [data]
  281.             [file]
  282.             テキストの挿入
  283.         add line
  284.             [data]
  285.             行の付加(テキストの付加に改行を加えたもの)
  286.         insert line (make line)
  287.             [on]
  288.             [data]
  289.             行の挿入
  290.             キャレット位置が保持されません
  291.         get
  292.             "window"のオブジェクトスペシファイアを返す
  293.         save
  294.             [as file]
  295.             [at folder]
  296.             テキストのファイル保存
  297.             "ブラウズウィンドウ"の場合は"message"で"selected"されている発言を保存
  298.         select
  299.             windowを最前面にする
  300.         close
  301.             windowを閉じる
  302.  
  303. "line"
  304. テキストの行クラス
  305.     メソッド
  306.         get
  307.             行のテキストを得る
  308.             改行は省かれる
  309.         set
  310.             行のテキストを入れ替える
  311.             改行は自動的に入る
  312.         delete
  313.             行の削除
  314.  
  315.  
  316. ■ サンプル
  317.  
  318. 1.このハンドルの発言を選択
  319.  
  320. tell application "Saneatsu Lite"
  321.     copy current bbs to theBBS
  322.     copy current forum of theBBS to theForum
  323.     copy current room of theForum to theRoom
  324.     copy current message of theRoom to theMessage
  325. --        カレントのメッセージを得るためにこう書いていますが現状では
  326. --        tell some message of some room of some forum of some bbs
  327. --        とも書けます
  328.     tell theMessage
  329.         copy handle to theHandle
  330.     end tell
  331. --        プロパティの値は一度代入してから使う方が確実のようです
  332.     tell theRoom
  333.         copy message count to theCount
  334.         repeat with n from 1 to theCount
  335.             tell message n
  336.                 if theHandle is handle then
  337.                     set selected to true
  338.                 else
  339.                     set selected to false
  340.                 end if
  341.             end tell
  342.         end repeat
  343.     end tell
  344.     activate
  345. end tell
  346.  
  347.  
  348. 2.シグニチャ挿入
  349.  
  350. tell application "Saneatsu Lite"
  351.     activate
  352.     copy scripts folder as string to theFolder
  353. --        スクリプトフォルダを文字列として得ることで加工を容易にしています
  354.     copy name of front window to theWinName
  355.     if theWinName is "ブラウズウィンドウ" then
  356.         beep
  357.     else
  358.         tell front window
  359.             insert data ((current date) as string) & return
  360.             insert file (theFolder & "Signature")
  361. --                現在日時と"Signature"ファイルの内容を現在のキャレット位置に挿入します
  362.         end tell
  363.     end if
  364. end tell
  365.  
  366.  
  367. 3.タイトル一覧
  368.  
  369. tell application "Saneatsu Lite"
  370.     activate
  371.     make window
  372.     copy result to theWindow
  373.     set name of theWindow to "タイトル一覧"
  374.     copy current bbs to theBBS
  375.     copy current forum of theBBS to theForum
  376.     copy current room of theForum to theRoom
  377.     tell theRoom
  378.         copy message count to theCount
  379.         repeat with n from 1 to theCount
  380. --            メッセージは見えている順番に1〜nです
  381.             copy title of message n to theTitle
  382. --                プロパティの値は一度代入してから使う方が確実のようです
  383.             tell theWindow
  384.                 add line data theTitle
  385.             end tell
  386.         end repeat
  387.     end tell
  388. end tell
  389.  
  390.  
  391. 4.ポストを開く
  392.  
  393. tell application "Saneatsu Lite"
  394.     copy post folder to theFolder
  395. --        プロパティの値は一度代入してから使う方が確実のようです
  396. end tell
  397.  
  398. --    實篤以外のアプリのスクリプトを書いても問題ありません
  399.  
  400. tell application "Finder"
  401.     select theFolder
  402.     open selection
  403. end tell
  404.  
  405.  
  406. 5.本文の引用
  407.  
  408. tell application "Saneatsu Lite"
  409.     activate
  410.     copy front window to theSayWin
  411.     copy window "ブラウズウィンドウ" to theLogWin
  412. --        いったんブラウズウィンドウをtheLogWinに、エディタウィンドウをtheSayWinに
  413. --        代入していますが、ウィンドウの位置関係が変化すると無効になります
  414.     if theSayWin is theLogWin then
  415.         beep
  416.     else
  417.         copy line count of theLogWin to theLoop
  418.         repeat with n from 1 to theLoop
  419.             copy line n of theLogWin to theLine
  420.             tell theSayWin
  421.                 insert data ("> " & theLine & return)
  422. --                    引用符付きで現在のキャレット位置に挿入します
  423.             end tell
  424.         end repeat
  425.     end if
  426. end tell
  427.  
  428.  
  429. 6.経過時間による削除OFF
  430.  
  431. --    現在のフォーラムの全会議室ファイルの経過時間による削除フラグをOFFにします。
  432. tell application "Saneatsu Lite"
  433.     activate
  434.     copy current bbs to theBBS
  435.     copy current forum of theBBS to theForum
  436.     tell theForum
  437.         copy room count to theRoomCount
  438.         repeat with n from 1 to theRoomCount
  439.             tell room n
  440.                 set delele_day_flag to false
  441. --                    経過時間による削除フラグをOFFにするとリソースに反映されます
  442.             end tell
  443.         end repeat
  444.     end tell
  445. end tell
  446.  
  447.